import java.util.Arrays;

import static java.lang.Math.max;

public class Solution {

    public int minSubArrayLen1(int target, int[] nums) {
        int left = 0;
        int right = 0;
        int sum = 0;
        int len = nums.length;
        Boolean tmp = false;
        while(right < nums.length) {
            while (right < nums.length && sum < target) {
                sum += nums[right++];
            }
            while(left < nums.length && sum >= target) {
                tmp = true;
                len = Math.min(len,right - left);
                sum -= nums[left++];
            }
        }
        if(tmp) {
            return len;
        } else {
            return 0;
        }
    }
    public int minSubArrayLen(int target, int[] nums)
    {
        int n = nums.length;
        int sum = 0;
        int len = Integer.MAX_VALUE;
        for(int left = 0, right = 0; right < n; right++) {
            sum += nums[right]; // 进窗⼝
            // 判断
            while(sum >= target) {
                len = Math.min(len, right - left + 1); // 更新结果
                sum -= nums[left++]; // 出窗⼝
            }
        }
        return len == Integer.MAX_VALUE ? 0 : len;
    }
    public int lengthOfLongestSubstring(String ss) {
        char[] s = ss.toCharArray();
        int[] hash = new int[128]; // ⽤数组模拟哈希表
        int left = 0;
        int right = 0;
        int n = ss.length();
        int ret = 0;
        while(right < n) {
            hash[s[right]]++; // 进⼊窗⼝
            // 判断
            while(hash[s[right]] > 1) {
                hash[s[left++]]--; // 出窗⼝
            }
            ret = Math.max(ret, right - left + 1); // 更新结果
            right++; // 让下⼀个字符进⼊窗⼝
        }
        return ret;
    }
    public int longestOnes(int[] nums, int k) {
        int ret = 0;
        for(int left = 0, right = 0, zero = 0; right < nums.length; right++) {
            if(nums[right] == 0) {
                zero++; // 进窗⼝
            }
            while(zero > k) {
                // 判断
                if(nums[left++] == 0) {
                    zero--; // 出窗⼝
                }
            }
            ret = Math.max(ret, right - left + 1); // 更新结果
        }
        return ret;
    }
    public int minOperations(int[] nums, int x) {
        int sum = 0;
        for(int a : nums) {
            sum += a;
        }
        int target = sum - x;
        // 处理细节
        if(target < 0) {
            return -1;
        }
        int ret = -1;
        for(int left = 0, right = 0, tmp = 0; right < nums.length; right++) {
            tmp += nums[right]; // 进窗⼝
            // 判断
            while(tmp > target) {
                tmp -= nums[left++]; // 出窗⼝
            }
            if(tmp == target){
                ret = Math.max(ret, right - left + 1); // 更新结果
            }
        }
        if(ret == -1) {
            return ret;
        } else {
            return nums.length - ret;
        }
    }
}
